// 丢失的this
var obj = {
  myName: 'sven',
  getName() {
    return this.myName;
  }
};
console.log(obj.getName()); // 输出：'sven'
var getName2 = obj.getName;
console.log(getName2()); // 输出：undefined

var getId = function(id){
  return document.getElementById(id);
};
getId('div1');

var getId = document.getElementById;
getId('div1');

// 利用apply修正this
document.getElementById = (function(func) {
  return function() {
    return func.apply(document, arguments);
  }
})(document.getElementById);
var getId = document.getElementById;
var div = getId('div1');
alert(div.id); // 输出： div1

// 用途
// 改变this指向
document.getElementById('div1').onclick = function() {
  alert(this.id); // 输出：div1
};
document.getElementById('div1').onclick = function() {
  alert(this.id); // 输出：div1
  var func = function() {
    alert (this.id); // 输出：undefined
  }
  func();
}; 
document.getElementById('div1').onclick = function() {
  var func = function() {
    alert (this.id); // 输出：div1
  }
  func.call(this);
};

// bind
Function.prototype.bind = function(context) {
  var self = this; // 保存原函数
  return function() { // 返回一个新的函数
    return self.apply(context, arguments);
  }
};
var obj = {
  name: 'sven'
};
var func = function() {
  alert (this.name); // 输出：sven
}.bind(obj);
func(); 
// 借用其他对象的方法
(function() {
  Array.prototype.push.call(arguments, 3);
  console.log(arguments); // 输出[1,2,3]
})(1, 2);
